from django.shortcuts import render
from django.views import View
from django.http import HttpResponse, JsonResponse
from django_redis import get_redis_connection

from meiduo_mall.libs.captcha.captcha import captcha

# from meiduo_mall.libs.yuntongxun.ccp_sms import CCP
from random import randint
from celery_tasks.sms.tasks import send_sms
# Create your views here.


# 图片验证码获取
class ImageView(View):
    """
        获取图片验证码类视图
    """
    def get(self, request, uuid):
        """

        生成图形验证码,保存到redis中,另外返回图片
        :param request: 请求对象
        :param uuid: 前端传递的图片编号，方便后续进行验证码验证，获取真实的验证码信息
        :return:一个图片
        """
        # 1.调用三方验证码生成包生成图片验证码
        text, img = captcha.generate_captcha()

        # 2.保存生成后的图片验证码,将验证码的数据保存再redis中(验证码信息不需要长期保存,redis可以设置有效期)
        # 2.1建立redis链接对象  参数是再配置文件中指定的redis库名
        conn = get_redis_connection('verify_code')
        # 2.2写入生成的验证码信息 setex写入字符串数据并指定有效期
        conn.setex('img_%s' % uuid, 300, text)
        # 3.返回图片验证码
        return HttpResponse(img, content_type='image/jpg')


# 短信验证码获取
class SendSMSView(View):
    """短信验证码"""

    def get(self, request, mobile):
        """
        :param reqeust: 请求对象
        :param mobile: 手机号
        :return: JSON
        """
        # 判断redis中有没有flag 数据,如果有说明已经发送过数据
        conn_sms = get_redis_connection('sms_code')
        flag = conn_sms.get('flag_%s' % mobile)
        if flag:
            return JsonResponse({
                'code': 400,
                'errmsg': '请勿频繁发送'})

        # 1.接收前端传递的数据内容 手机号 用户输入的验证以及图片验证码id
        # 用户输入的
        image_code = request.GET.get('image_code')
        # 图片验证码的id
        image_code_id = request.GET.get('image_code_id')

        # 2.验证用户输入的验证码和实际生成的是否一致
        # 2.1从 redis 中获取保存再redis中的真实验证码
        conn = get_redis_connection('verify_code')
        real_code = conn.get('img_%s' % image_code_id)
        # real_code shi bytes 类型
        real_code_str = real_code.decode()
        # 2.2比对用户输入的和真实验证码
        if image_code.lower() != real_code_str.lower():
            return JsonResponse({'code': 400,
                                 'errmsg': '两个验证码不一致'}, status=400)

        # 3.发送短信
        # 3.1生成短信验证码, 借助random 随机生成
        sms_code = '%06d' % randint(0, 9999999)
        # 打印验证码
        print(sms_code)
        # 3.2将验证码保存在 redis 中的 三号库
        # # conn_sms = get_redis_connection('sms_code')
        # # 短信验证码有效期，单位：300秒
        # conn_sms.setex('sms_code_%s' % mobile, 300, sms_code)
        # # 3.3(2)写入一个60s有效期的判断数据
        # conn_sms.setex('flag_%s' % mobile, 60, 'flag')

        # 使用redis管道(多次写入可以使用管道(pipeline))
        # 生成管道对象
        pline = conn_sms.pipeline()
        # 将 Redis 请求添加到队列
        pline.setex('sms_code_%s' % mobile, 300, sms_code)
        pline.setex('flag_%s' % mobile, 60, 'flag')
        # 执行管道
        pline.execute()

        # 3.3调用容联云发送短信
        # 原来的写法
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)
        # 为了避免网络阻塞,造成发送短信阻塞当前线程执行,可以采用异步形式发送短信
        # 现在的写法, 注意: 这里的函数,调用的时候需要加: .delay()
        send_sms.delay(mobile, sms_code)

        # 4.返回结果(响应结果)
        return JsonResponse({'msg': 'ok'})